/*	Nama file		: DateTime.c
	Deskripsi		: Body type dan prototype primitif type DateTime
	Nama pembuat	: Jonathan Ery Pradana (23512038), Muhammad Ghufron Mahfudhi (23512066), Ni Made Satvika Iswari (23512077)
	Hari / Tanggal	: Selasa, 25 September 2012
	Editor			: Senin, 1 Oktober 2012 oleh Muhammad Ghufron Mahfudhi (IsEqDT, IsDTBefore, IsDTAfter)
*/

#include "DateTime.h"

/** Getter dan Setter **/
Date GetDate(DateTime dateTime)
/* Mengembalikan Tanggal dari dateTime */
{
	return dateTime.date;
}

Time GetTime(DateTime dateTime)
/* Mengembalikan Waktu dari dateTime */
{
	return dateTime.time;
}

void SetDate(DateTime *dateTime, Date newDate)
/* Mengubah nilai Tanggal dari dateTime */
{
	(*dateTime).date = newDate;
}

void SetTime(DateTime *dateTime, Time newTime) 
/* Mengubah nilai Waktu dari dateTime */
{
	(*dateTime).time = newTime;
}

/** Konstruktor **/
DateTime MakeDateTime (Date newDate, Time newTime)
/* Membentuk DateTime dari Tanggal newDate dan Waktu newTime */
/* Prekondisi : newDate dan newTime dapat membentuk DateTime yang valid */
{
	/* KAMUS LOKAL */
	DateTime newDateTime;
	
	/* ALGORITMA */
	SetDate(&newDateTime, newDate);
	SetTime(&newDateTime, newTime);
	
	return newDateTime;
}
DateTime MakeDateTimefromStr(char str[])
/* Membentuk DateTime dari elemen yang bertipe string */
{
	/* Kamus Lokal */
	Date D;
	Time T;
	DateTime dateTime;
	char delims[] = " /:";
	char date[MAX_CHAR];
	char month[MAX_CHAR];
	char year[MAX_CHAR];
	
	char hour[MAX_CHAR];
	char min[MAX_CHAR];
	char sec[MAX_CHAR];
	char *tmp;
	
	/* Algoritma */
	tmp = strtok( str, delims );
	strcpy (date, tmp);
	tmp = strtok( NULL, delims );
	strcpy (month, tmp);
	tmp = strtok( NULL, delims );
	strcpy (year, tmp);
	D = MakeDatefromStr(date, month, year);
	
	tmp = strtok( NULL, delims );
	strcpy (hour, tmp);
	tmp = strtok( NULL, delims );
	strcpy (min, tmp);
	tmp = strtok( NULL, delims );
	strcpy (sec, tmp);
	T = MakeTimefromStr(hour, min, sec);
	
	dateTime = MakeDateTime (D,T);
	return dateTime;
}

/** Operator Baca Tulis **/
void BacaDateTime(DateTime *dateTime)
/* I.S. Sembarang */
/* F.S. dateTime terdefinisi dan merupakan dateTime yang valid */
/* Proses : Membaca komponen dateTime dari masukan pengguna */
{
	/* KAMUS LOKAL */
	Date D;
	Time T;
	
	/* ALGORITMA */
	printf("  Membuat Tanggal :\n");
	BacaTanggal(&D);
	printf("  Membuat Jam :\n");
	BacaTime(&T);
	
	*dateTime = MakeDateTime(D, T);
}

void TulisDateTime(DateTime dateTime)
/* I.S. dateTime terdefinisi */
/* F.S. Nilai dateTime ditulis ke layar beserta komponen-komponennya */
/* Proses : Menulis nilai setiap komponen dateTime ke layar */
{
	printf("%s", DateTimeToString(dateTime));
}

/* Predikat */
int IsEqDT (DateTime D1, DateTime D2)
/*	Menghasilkan 1 jika D1 = D2 */
{
	/* KAMUS LOKAL */
	/* ALGORITMA */
	return IsEqD(GetDate(D1), GetDate(D2)) && EqTime(GetTime(D1), GetTime(D2));
}

int IsDTBefore (DateTime D1, DateTime D2)
/*	Menghasilkan 1 jika D1 adalah tanggal sebelum D2 */
{
	/* KAMUS LOKAL */
	/* ALGORITMA */
	return IsBefore(GetDate(D1), GetDate(D2)) || (IsEqD(GetDate(D1), GetDate(D2)) && isLessThan(GetTime(D1), GetTime(D2)));
}

int IsDTAfter (DateTime D1, DateTime D2)
/*	Menghasilkan 1 jika D1 adalah tanggal sesudah D2 */
{
	/* KAMUS LOKAL */
	/* ALGORITMA */
	return IsAfter(GetDate(D1), GetDate(D2)) || (IsEqD(GetDate(D1), GetDate(D2)) && isGreaterThan(GetTime(D1), GetTime(D2)));
}

int NBMonth(DateTime *D, int NBD)
/*	Menghasilkan banyaknya bulan yang terdapat dalam jangkauan array DateTime D */

/*	LOG Minggu 7 Oktober 2012 : Jonathan Ery Membuat Fungsi */

{
	/* KAMUS LOKAL */
	Date first;
	Date last;
	
	/* ALGORITMA */
	if (NBD > 0){
		first = MakeDate(GetDay(GetDate(D[0])),GetMonth(GetDate(D[0])),GetYear(GetDate(D[0])));
		last = MakeDate(GetDay(GetDate(D[NBD-1])),GetMonth(GetDate(D[NBD-1])),GetYear(GetDate(D[NBD-1])));
		if (GetMonth(first) > GetMonth (last)){
			return ((GetYear(last)-GetYear(first))*12) + (12 - GetMonth(first) + 1) + (GetMonth(last));
		} else {
			return ((GetYear(last)-GetYear(first))*12) + (GetMonth(last) - GetMonth(first) + 1);
		}
	} else {
		return 0;
	}
}

char* DateTimeToString (DateTime DT)
/* Mengembalikan DateTime dalam format dd/mm/yyy hh:mm:ss */
{
	/* KAMUS LOKAL */
	char *tmp;
	
	/* ALGORITMA */
	tmp = (char*) malloc (MAX_CHAR * sizeof(char));
	strcpy(tmp, DateToString(GetDate(DT)));
	strcat(tmp, " ");
	strcat(tmp, TimeToString(GetTime(DT)));
	
	return tmp;
}

